/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-10-17 00:56:42
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-10-17 01:02:28
 * @FilePath: /cjb/linux-operating-system-network/linux10/code/text.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t pid;

    pid = fork();
    if (pid < 0)
    {
        printf("%s fork error\n", __FUNCTION__);
        return 1;
    }
    else if (pid == 0)
    { // child
        printf("child is run, pid is : %d\n", getpid());
        sleep(5);
        exit(1);
    }
    else
    {
        int status = 0;
        pid_t ret = 0;
        do
        {
            ret = waitpid(-1, &status, WNOHANG); // 非阻塞式等待
            if (ret == 0)
            {
                printf("child is running\n");
            }
            sleep(1);
        } while (ret == 0);

        if (WIFEXITED(status) && ret == pid)
        {
            printf("wait child 5s success, child return code is :%d.\n", WEXITSTATUS(status));
        }
        else
        {
            printf("wait child failed, return.\n");
            return 1;
        }
    }
    return 0;
}

// int main()
// {
//     pid_t pid;
//     pid = fork();
//     if (pid < 0)
//     {
//         printf("%s fork error\n", __FUNCTION__);
//         return 1;
//     }
//     else if (pid == 0)
//     { // child
//         printf("child is run, pid is : %d\n", getpid());
//         sleep(5);
//         exit(257);
//     }
//     else
//     {
//         int status = 0;
//         pid_t ret = waitpid(-1, &status, 0); // 阻塞式等待，等待5S
//         printf("this is test for wait\n");
//         if (WIFEXITED(status) && ret == pid)
//         {
//             printf("wait child 5s success, child return code is :%d.\n", WEXITSTATUS(status));
//         }
//         else
//         {
//             printf("wait child failed, return.\n");
//             return 1;
//         }
//     }
// }

// 如果 pid == 0，说明当前执行的是子进程。子进程会输出其进程ID（getpid()），然后调用 sleep(5) 休眠5秒，最后以状态码 257 退出。
// 如果 pid > 0，表示当前执行的是父进程。父进程会定义一个 status 变量来存储子进程的退出状态，并调用 waitpid(-1, &status, 0) 阻塞式等待子进程的结束。这里 -1 表示等待任何子进程。
// 这里使用 WIFEXITED(status) 检查子进程是否正常结束，ret == pid 检查返回的PID是否是子进程的PID。如果两者都成立，则输出子进程的返回码，使用 WEXITSTATUS(status) 提取子进程的退出状态。
// 如果子进程没有正常结束，程序将输出错误信息并返回 1。